home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / varie / uae-0_64.lha / uae-0.6.4 / src / hardfile.c < prev    next >
C/C++ Source or Header  |  1996-08-18  |  6KB  |  260 lines

  1.  /*
  2.   * UAE - The Un*x Amiga Emulator
  3.   *
  4.   * AutoConfig devices
  5.   *
  6.   * (c) 1995 Bernd Schmidt
  7.   */
  8.  
  9. #include "sysconfig.h"
  10. #include "sysdeps.h"
  11.  
  12. #include "config.h"
  13. #include "options.h"
  14. #include "memory.h"
  15. #include "custom.h"
  16. #include "newcpu.h"
  17. #include "disk.h"
  18. #include "xwin.h"
  19. #include "autoconf.h"
  20.  
  21. static int opencount = 0;
  22. static int uaedevfd;
  23. int numtracks = 512;
  24.  
  25. static ULONG hardfile_init(void)
  26. {
  27.     ULONG tmp1, devicenode, bootnode;
  28.     int have36 = 1;
  29.     ULONG retval = regs.d[0];
  30.  
  31.     filesys_init();
  32.  
  33.     return retval;
  34. }
  35.  
  36. static ULONG hardfile_open(void)
  37. {
  38.     CPTR tmp1 = regs.a[1]; /* IOReq */
  39.  
  40.     /* Check unit number */
  41.     if (regs.d[0] == 0) {
  42.     opencount++;
  43.     put_word (regs.a[6]+32, get_word (regs.a[6]+32) + 1);
  44.     put_long (tmp1+24, 0); /* io_Unit */
  45.     put_byte (tmp1+31, 0); /* io_Error */
  46.     put_byte (tmp1+8, 7); /* ln_type = NT_REPLYMSG */
  47.     return 0;
  48.     }
  49.  
  50.     put_long (tmp1+20, (ULONG)-1);
  51.     put_byte (tmp1+31, (UBYTE)-1);
  52.     return (ULONG)-1;
  53. }
  54.  
  55. static ULONG hardfile_close(void)
  56. {
  57.     opencount--;
  58.     put_word (regs.a[6]+32, get_word (regs.a[6]+32) - 1);
  59.  
  60.     return regs.d[0];
  61. }
  62.  
  63. static ULONG hardfile_expunge(void)
  64. {
  65.     return 0; /* Simply ignore this one... */
  66. }
  67.  
  68. static ULONG hardfile_beginio(void)
  69. {
  70.     ULONG tmp1, tmp2, dataptr, offset;
  71.     ULONG retval = regs.d[0];
  72.  
  73.     tmp1 = regs.a[1];
  74.     put_byte (tmp1+8, 5); /* set ln_type to NT_MESSAGE */
  75.     put_byte (tmp1+31, 0); /* no error yet */
  76.     tmp2 = get_word (tmp1+28); /* io_Command */
  77.     switch (tmp2) {
  78.      case 2: /* Read */
  79.     dataptr = get_long (tmp1 + 40);
  80.     if (dataptr & 1)
  81.         goto bad_command;
  82.     offset = get_long (tmp1 + 44);
  83.     if (offset & 511)
  84.         goto bad_command;
  85.     tmp2 = get_long (tmp1 + 36); /* io_Length */
  86.     if (tmp2 & 511)
  87.         goto bad_command;
  88.     if (tmp2 + offset > (ULONG)numtracks * 32 * 512)
  89.         goto bad_command;
  90.  
  91.     put_long (tmp1 + 32, tmp2); /* set io_Actual */
  92.     lseek (uaedevfd, offset, SEEK_SET);
  93.     while (tmp2) {
  94.         int i;
  95.         char buffer[512];
  96.         read (uaedevfd, buffer, 512);
  97.         for (i = 0; i < 512; i++, dataptr++)
  98.         put_byte(dataptr, buffer[i]);
  99.         tmp2 -= 512;
  100.     }
  101.     break;
  102.  
  103.      case 3: /* Write */
  104.      case 11: /* Format */
  105.     dataptr = get_long (tmp1 + 40);
  106.     if (dataptr & 1)
  107.         goto bad_command;
  108.     offset = get_long (tmp1 + 44);
  109.     if (offset & 511)
  110.         goto bad_command;
  111.     tmp2 = get_long (tmp1 + 36); /* io_Length */
  112.     if (tmp2 & 511)
  113.         goto bad_command;
  114.     if (tmp2 + offset > (ULONG)numtracks * 32 * 512)
  115.         goto bad_command;
  116.  
  117.     put_long (tmp1 + 32, tmp2); /* set io_Actual */
  118.     lseek (uaedevfd, offset, SEEK_SET);
  119.     while (tmp2) {
  120.         char buffer[512];
  121.         int i;
  122.         for (i=0; i < 512; i++, dataptr++)
  123.         buffer[i] = get_byte(dataptr);
  124.         write (uaedevfd, buffer, 512);
  125.         tmp2 -= 512;
  126.     }
  127.     break;
  128.  
  129.     bad_command:
  130.     break;
  131.  
  132.      case 18: /* GetDriveType */
  133.     put_long (tmp1 + 32, 1); /* not exactly a 3.5" drive, but... */
  134.     break;
  135.  
  136.      case 19: /* GetNumTracks */
  137.     put_long (tmp1 + 32, numtracks);
  138.     break;
  139.  
  140.     /* Some commands that just do nothing and return zero */
  141.      case 4: /* Update */
  142.      case 5: /* Clear */
  143.      case 9: /* Motor */
  144.      case 10: /* Seek */
  145.      case 12: /* Remove */
  146.      case 13: /* ChangeNum */
  147.      case 14: /* ChangeStatus */
  148.      case 15: /* ProtStatus */
  149.      case 20: /* AddChangeInt */
  150.      case 21: /* RemChangeInt */
  151.     put_long (tmp1+32, 0); /* io_Actual */
  152.     retval = 0;
  153.     break;
  154.  
  155.      default:
  156.     /* Command not understood. */
  157.     put_byte (tmp1+31, (UBYTE)-3); /* io_Error */
  158.     retval = 0;
  159.     break;
  160.     }
  161.     if ((get_byte (tmp1+30) & 1) == 0) {
  162.     /* Not IOF_QUICK -- need to ReplyMsg */
  163.     regs.a[1] = tmp1;
  164.     CallLib (get_long(4), -378);
  165.     }
  166.     return retval;
  167. }
  168.  
  169. static ULONG hardfile_abortio(void)
  170. {
  171.     return (ULONG)-3;
  172. }
  173.  
  174. void hardfile_install(void)
  175. {
  176.     ULONG functable, datatable, inittable;
  177.     ULONG initcode, openfunc, closefunc, expungefunc;
  178.     ULONG nullfunc, beginiofunc, abortiofunc;
  179.  
  180.     uaedevfd = open ("hardfile", O_RDWR | O_BINARY);
  181.  
  182.     ROM_hardfile_resname = ds("hardfile.device");
  183.     ROM_hardfile_resid = ds("UAE hardfile.device 0.2");
  184.  
  185.     numtracks = hardfile_size / 16384;
  186.  
  187.     /* initcode */
  188.     initcode = here();
  189.     calltrap(deftrap(hardfile_init)); dw(RTS);
  190.  
  191.     /* Open */
  192.     openfunc = here();
  193.     calltrap(deftrap(hardfile_open)); dw(RTS);
  194.  
  195.     /* Close */
  196.     closefunc = here();
  197.     calltrap(deftrap(hardfile_close)); dw(RTS);
  198.  
  199.     /* Expunge */
  200.     expungefunc = here();
  201.     calltrap(deftrap(hardfile_expunge)); dw(RTS);
  202.  
  203.     /* Null */
  204.     nullfunc = here();
  205.     dw(0x7000); /* return 0; */
  206.     dw(RTS);
  207.  
  208.     /* BeginIO */
  209.     beginiofunc = here();
  210.     calltrap(deftrap(hardfile_beginio)); dw(RTS);
  211.  
  212.     /* AbortIO */
  213.     abortiofunc = here();
  214.     calltrap(deftrap(hardfile_abortio)); dw(RTS);
  215.  
  216.     /* FuncTable */
  217.     functable = here();
  218.     dl(openfunc); /* Open */
  219.     dl(closefunc); /* Close */
  220.     dl(expungefunc); /* Expunge */
  221.     dl(nullfunc); /* Null */
  222.     dl(beginiofunc); /* BeginIO */
  223.     dl(abortiofunc); /* AbortIO */
  224.     dl(0xFFFFFFFF); /* end of table */
  225.  
  226.     /* DataTable */
  227.     datatable = here();
  228.     dw(0xE000); /* INITBYTE */
  229.     dw(0x0008); /* LN_TYPE */
  230.     dw(0x0300); /* NT_DEVICE */
  231.     dw(0xC000); /* INITLONG */
  232.     dw(0x000A); /* LN_NAME */
  233.     dl(ROM_hardfile_resname);
  234.     dw(0xE000); /* INITBYTE */
  235.     dw(0x000E); /* LIB_FLAGS */
  236.     dw(0x0600); /* LIBF_SUMUSED | LIBF_CHANGED */
  237.     dw(0xD000); /* INITWORD */
  238.     dw(0x0014); /* LIB_VERSION */
  239.     dw(0x0004); /* 0.4 */
  240.     dw(0xD000);
  241.     dw(0x0016); /* LIB_REVISION */
  242.     dw(0x0000);
  243.     dw(0xC000);
  244.     dw(0x0018); /* LIB_IDSTRING */
  245.     dl(ROM_hardfile_resid);
  246.     dw(0x0000); /* end of table */
  247.  
  248.     ROM_hardfile_init = here();
  249.     dl(0x00000100); /* ??? */
  250.     dl(functable);
  251.     dl(datatable);
  252.     dl(initcode);
  253.  
  254.     if (uaedevfd >= 0) {
  255.     CPTR initfunc;
  256.     
  257.     add_filesys_unit(NULL, "hardfile", 1);
  258.     }
  259. }
  260.